#include <bits/stdc++.h>
using namespace std;

int s[55][55]; // 定义一个二维数组，用于存储输入的矩阵
int dp[55][55][55][55]; // 定义一个四维数组，用于存储动态规划的结果

int m, n; // 定义矩阵的行数和列数
int main()
{
    cin >> m >> n; // 输入矩阵的行数和列数
    for (int i = 1; i <= m; i++)
        for (int j = 1; j <= n; j++)
            cin >> s[i][j]; // 输入矩阵的元素
    for (int i = 1; i <= m; i++)
        for (int j = 1; j <= n; j++)
            for (int k = 1; k <= m; k++)
                for (int l = 1; l <= n; l++)
                {
                    // 动态规划的状态转移方程
                    dp[i][j][k][l] = max({dp[i - 1][j][k - 1][l], dp[i - 1][j][k][l - 1], dp[i][j - 1][k - 1][l], dp[i][j - 1][k][l - 1]}) + s[i][j] + s[k][l];
                    // 如果i和k相等且j和l相等，说明i和k是同一个点，需要减去s[i][j]
                    if (i == k && j == l)
                        dp[i][j][k][l] -= s[i][j];
                }
    cout << dp[m][n - 1][m - 1][n] << endl; // 输出结果
    return 0;
}